<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class OnlineUser extends Model
{
    use HasFactory;

    protected $table = 'online_users';

    protected $fillable = [
        'user_id',
        'username',
        'token',
        'ip',
        'user_agent',
        'login_at',
        'last_activity_at',
        // online_duration 字段可能不存在，在需要时动态添加
    ];

    protected $casts = [
        'login_at' => 'datetime',
        'last_activity_at' => 'datetime',
        // online_duration 字段可能不存在，不在这里定义cast
        // 如果需要，可以在访问器中处理
    ];
    
    /**
     * 获取在线时长（秒）
     *
     * @return int
     */
    public function getOnlineDurationAttribute(): int
    {
        // 如果字段存在，返回字段值
        if (isset($this->attributes['online_duration'])) {
            return (int) $this->attributes['online_duration'];
        }
        
        // 如果字段不存在，使用login_at计算
        if ($this->login_at) {
            return now()->diffInSeconds($this->login_at);
        }
        
        return 0;
    }
    
    /**
     * 获取格式化的在线时长
     *
     * @return string
     */
    public function getFormattedOnlineDurationAttribute(): string
    {
        $seconds = $this->online_duration;
        
        if ($seconds < 60) {
            return $seconds . '秒';
        } elseif ($seconds < 3600) {
            $minutes = floor($seconds / 60);
            $remainingSeconds = $seconds % 60;
            return $minutes . '分' . ($remainingSeconds > 0 ? $remainingSeconds . '秒' : '');
        } elseif ($seconds < 86400) {
            $hours = floor($seconds / 3600);
            $remainingMinutes = floor(($seconds % 3600) / 60);
            return $hours . '小时' . ($remainingMinutes > 0 ? $remainingMinutes . '分' : '');
        } else {
            $days = floor($seconds / 86400);
            $remainingHours = floor(($seconds % 86400) / 3600);
            return $days . '天' . ($remainingHours > 0 ? $remainingHours . '小时' : '');
        }
    }
    
    /**
     * 更新在线时长
     *
     * @return void
     */
    public function updateOnlineDuration(): void
    {
        if ($this->login_at) {
            $duration = now()->diffInSeconds($this->login_at);
            // 检查字段是否存在于数据库中
            try {
                // 使用Schema检查字段是否存在
                if (\Illuminate\Support\Facades\Schema::hasColumn($this->getTable(), 'online_duration')) {
                    $this->update(['online_duration' => $duration]);
                }
            } catch (\Exception $e) {
                // 如果检查失败，忽略错误（字段可能不存在）
            }
        }
    }

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

